﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Collections.Generic;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Alocacao.Presenter;

namespace Sinacor.UI.Bovespa.Alocacao.View.SmartClient
{
    public partial class DistribuicaoNegociosDigitacao : SinacorWindow, IDistribuicaoNegociosDigitacao
    {
        private Presenter.DistribuicaoNegociosDigitacao _presenter;

        public Presenter.DistribuicaoNegociosDigitacao Presenter
        {
            get { return _presenter; }
        }

        #region Construtores

        /// <summary>
        /// Método construtor sem parametro
        /// </summary>
        public DistribuicaoNegociosDigitacao() : this(null) { }

        /// <summary>
        /// Método construtor com paremetro
        /// </summary>
        /// <param name="listaDisponiveis"></param>
        public DistribuicaoNegociosDigitacao(ModelCollection<Model.NegocioNaoDistribuido> listaDisponiveis)
        {
            this.InitializeComponent();

            if (listaDisponiveis == null)
            {
                InformarListaNegociosVazia();
                return;
            }
            
            _presenter = new Presenter.DistribuicaoNegociosDigitacao(this, listaDisponiveis);
            _presenter.Inicializar();

            this.AtualizarListaDigitacao();
            dtgDigitacaoDistribuicao.NewItemType = typeof(Model.DadosDistribuicao);         
            this.DataContext = _presenter;
            
            ExpImportacaoDigitacao.IsEnabled = true;

            BloquearColunasIndLiquidacaoExternaCliente();

            cmbLayoutsImportacao.Items.Add(this.FindResource("Bovespa.Alocacao.Label.PlanilhaExcelXLS").ToString());
            cmbLayoutsImportacao.SelectedIndex = 0;

            this.Closed += new EventHandler(DistribuicaoNegociosDigitacao_Closed);
        }

        #endregion

        #region IDistribuicaoNegociosDigitacao Members

        public void AtualizarListaDigitacao()
        {
            dtgDigitacaoDistribuicao.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void BloquearColunaPercentual()
        {
            SinacorDecimalTextBox _txt = null;
            if (this.dtgDigitacaoDistribuicao.IsInserting)
            {                
                _txt = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetInsertionRow(), "TxtPercentualDistribuicao");
                _txt.IsEnabled = false;
            }
            else if (this.dtgDigitacaoDistribuicao.IsEditing)            
            {
                _txt = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetEditRow(), "TxtPercentualDistribuicao");
                _txt.IsEnabled = false;       
            }
        }

        public void BloquearColunaPercRedAcr()
        {
            dtgDigitacaoDistribuicao.Columns["PercReducaoAcrescimo"].AllowInsert = false;
            dtgDigitacaoDistribuicao.Columns["PercReducaoAcrescimo"].AllowUpdate = false;
        }

        public void BloquearColunasDirecionado()
        {
            dtgDigitacaoDistribuicao.Columns["ClienteDirecionado"].AllowInsert = false;
            dtgDigitacaoDistribuicao.Columns["ClienteDirecionado"].AllowUpdate = false;

            dtgDigitacaoDistribuicao.Columns["DVClienteDirecionado"].AllowInsert = false;
            dtgDigitacaoDistribuicao.Columns["DVClienteDirecionado"].AllowUpdate = false;

            dtgDigitacaoDistribuicao.Columns["UsuarioDirecionado"].AllowInsert = false;
            dtgDigitacaoDistribuicao.Columns["UsuarioDirecionado"].AllowUpdate = false;
        }

        public void BloquearColunasQuantidadePreco()
        {
            SinacorDecimalTextBox _txtQtd = null;
            SinacorDecimalTextBox _txtPreco = null;
            if (this.dtgDigitacaoDistribuicao.IsInserting)
            {
                _txtPreco = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetInsertionRow(), "TxtPreco");
                _txtQtd = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetInsertionRow(), "TxtQuantidade");
                _txtPreco.IsEnabled = false;
                _txtQtd.IsEnabled = false;
            }
            else if (this.dtgDigitacaoDistribuicao.IsEditing)
            {
                _txtPreco = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetEditRow(), "TxtPreco");
                _txtQtd = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetEditRow(), "TxtQuantidade");
                _txtPreco.IsEnabled = false;
                _txtQtd.IsEnabled = false;
            } 
        }

        public void BloquearColunasIndLiquidacaoExternaCliente()
        {
            dtgDigitacaoDistribuicao.Columns["IndLiquidacaoExternaCliente"].AllowInsert = false;
            dtgDigitacaoDistribuicao.Columns["IndLiquidacaoExternaCliente"].AllowUpdate = false;
        }

        public void DesbloquearColunaPercentual()
        {
            SinacorDecimalTextBox _txt = null;
            if (this.dtgDigitacaoDistribuicao.IsInserting)
            {
                _txt = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetInsertionRow(), "TxtPercentualDistribuicao");
                _txt.IsEnabled = true;
            }
            else if (this.dtgDigitacaoDistribuicao.IsEditing)
            {
                _txt = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetEditRow(), "TxtPercentualDistribuicao");
                _txt.IsEnabled = true;
            }
        }

        public void DesbloquearColunasQuantidadePreco()
        {
            SinacorDecimalTextBox _txtQtd = null;
            SinacorDecimalTextBox _txtPreco = null;
            if (this.dtgDigitacaoDistribuicao.IsInserting)
            {
                _txtPreco = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetInsertionRow(), "TxtPreco");
                _txtQtd = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetInsertionRow(), "TxtQuantidade");
                _txtPreco.IsEnabled = true;
                _txtQtd.IsEnabled = true;
            }
            else if (this.dtgDigitacaoDistribuicao.IsEditing)
            {
                _txtPreco = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetEditRow(), "TxtPreco");
                _txtQtd = (SinacorDecimalTextBox)ControlHelper.FindChild(this.dtgDigitacaoDistribuicao.GetEditRow(), "TxtQuantidade");
                _txtPreco.IsEnabled = true;
                _txtQtd.IsEnabled = true;
            }            
        }

        public void DesbloquearColunasIndLiquidacaoExternaCliente()
        {
            dtgDigitacaoDistribuicao.Columns["IndLiquidacaoExternaCliente"].AllowInsert = true;
            dtgDigitacaoDistribuicao.Columns["IndLiquidacaoExternaCliente"].AllowUpdate = true;
        }

        public void InformarSucessoOperacao()
        {                                           
            SinacorMessageBox.Show(FindResource("Bovespa.Alocacao.Message.SucessoOperacao").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
        }

        public void InformarListaNegociosVazia()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Alocacao.Message.InformarObjetoNulo").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Error);
            this.Close();
        }

        /// <summary>
        /// Informar que o arquivo não contem dados ou não está no formato correto
        /// </summary>
        public void InformarArquivoVazio()
        {
            flpDistribuicaoImportacao.IsEnabled = true;
            btnDistribuicaoImportacao.IsEnabled = true;
            dtgDigitacaoDistribuicao.IsEnabled = true;
            btnCancelarImportacao.IsEnabled = false;

            SinacorMessageBox.Show(this.FindResource("Bovespa.Alocacao.Message.PlanilhaVazia").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Error);
        }

        /// <summary>
        /// Informa que arquivo não é válido
        /// </summary>
        public void InformarErroImportacao()
        {
            this.Dispatcher.BeginInvoke((Action)delegate()
            {
                flpDistribuicaoImportacao.IsEnabled = true;
                btnDistribuicaoImportacao.IsEnabled = true;
                dtgDigitacaoDistribuicao.IsEnabled = true;
                btnCancelarImportacao.IsEnabled = false;

                SinacorMessageBox.Show(this.FindResource("Bovespa.Alocacao.Message.ErroImportacao").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Error);
            });
        }

        public void InformarImportacaoCancelada()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                flpDistribuicaoImportacao.IsEnabled = true;
                btnDistribuicaoImportacao.IsEnabled = true;
                dtgDigitacaoDistribuicao.IsEnabled = true;
                btnCancelarImportacao.IsEnabled = false;

                SinacorMessageBox.Show(this.FindResource("Bovespa.Alocacao.Message.ImportacaoCancelada").ToString(),
                                       SinacorMessageBoxButton.Ok,
                                       SinacorMessageBoxImage.Exclamation);
            },
           System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void InformarImportacaoConcluida()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                flpDistribuicaoImportacao.IsEnabled = true;
                btnDistribuicaoImportacao.IsEnabled = true;
                dtgDigitacaoDistribuicao.IsEnabled = true;
                btnCancelarImportacao.IsEnabled = false;

                SinacorMessageBox.Show(this.FindResource("Bovespa.Alocacao.Message.ImportacaoSucesso").ToString(),
                                       SinacorMessageBoxButton.Ok,
                                       SinacorMessageBoxImage.Information);
            },
            System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void HabilitarCancelamentoProcesso()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                btnCancelarImportacao.IsEnabled = true;
            },
           System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

        public void AtualizarStatus()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                if (String.IsNullOrEmpty(_presenter.StatusProcesso.Step))
                {
                    pgbDistribuicaoProgresso.ProgressBarText = null;
                }
                else
                {
                    pgbDistribuicaoProgresso.ProgressBarText = FindResource(_presenter.StatusProcesso.Step).ToString();
                }

                pgbDistribuicaoProgresso.UpdateTarget(SinacorProgressBar.ValueProperty);
            });
        }

        #endregion

        private void DistribuicaoNegociosDigitacao_Closed(object sender, EventArgs e)
        {
            _presenter.Dispose();
        }

        private void ContextMenu_ValidarDigitacao_Click(object sender, RoutedEventArgs e)
        {
            ShowUserWaitingProcess();
            ClearServiceErrors();            
            _presenter.ValidarDigitacao();
            _presenter.CalcularControleDistribuicao();
            txtQtdDistribuida.Value = _presenter.DigitadosQuantidade.Value;
            txtPercDistribuido.Value = decimal.Round(_presenter.DigitadosPercentual.Value, 2);
            txtQtdDistribuida.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            txtPercDistribuido.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            HideUserWaitingProcess();
        }     

        private void Quantidade_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            SinacorDecimalTextBox campoQuantidade = (SinacorDecimalTextBox)sender;

            if (e.Key == Key.OemPeriod || e.Key == Key.AbntC2)
            {
                if (campoQuantidade.Value * 1000000 <= 99999999999.9999M)
                {
                    campoQuantidade.Value *= 1000000;

                    campoQuantidade.SelectionStart = campoQuantidade.Text.Length;
                }
            }

            if (e.Key == Key.K)
            {
                if (campoQuantidade.Value * 1000 <= 999999999999.9999M)
                {
                    campoQuantidade.Value *= 1000;
                    campoQuantidade.SelectionStart = campoQuantidade.Text.Length;
                }
            }

        }

        private void dtgDigitacaoDistribuicao_SavingAll(object sender, CancelItemsEventArgs e)
        {
            ShowUserWaitingProcess();
            ClearServiceErrors();
            
            if (!_presenter.SalvarDigitacao())
                e.Cancel = true;
            
            HideUserWaitingProcess();
        }        

        private void dtgDigitacaoDistribuicao_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                ShowUserWaitingProcess();
                ClearServiceErrors();

                _presenter.ValidarDigitacaoLinhaAtual((Model.DadosDistribuicao)e.ItemInfo.Item);

                if (HasErrors)
                {
                    e.Cancel = true;
                }

                BloquearColunasIndLiquidacaoExternaCliente();

                HideUserWaitingProcess();
            }
        }       

        private void dtgDigitacaoDistribuicao_Inserted(object sender, ItemEventArgs e)
        {
            _presenter.CalcularControleDistribuicao();
            txtQtdDistribuida.Value = _presenter.DigitadosQuantidade.Value;
            txtPercDistribuido.Value = decimal.Round(_presenter.DigitadosPercentual.Value, 2);
            txtQtdDistribuida.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
            txtPercDistribuido.UpdateTarget(SinacorDecimalTextBox.ValueProperty);
        }

        private void dtgDigitacaoDistribuicao_BeingInserted(object sender, CancelItemEventArgs e)
        {
            DesbloquearColunasIndLiquidacaoExternaCliente();
        }

        private void dtgDigitacaoDistribuicao_CancelingInsert(object sender, CancelItemEventArgs e)
        {
            BloquearColunasIndLiquidacaoExternaCliente();
        }

        private void Quantidade_LostFocus(object sender, RoutedEventArgs e)
        {
            Model.DadosDistribuicao obj = null;
            if (this.dtgDigitacaoDistribuicao.IsInserting)
                obj = (Model.DadosDistribuicao)this.dtgDigitacaoDistribuicao.GetCurrentRow().Item;
            else if (this.dtgDigitacaoDistribuicao.IsEditing)
            {
                obj = (Model.DadosDistribuicao)this.dtgDigitacaoDistribuicao.GetEditRow().Item;
                SinacorDecimalTextBox _txt = (SinacorDecimalTextBox)sender;                
                obj.QuantidadeEspecificar = _txt.Value > 0 ? _txt.Value : 0;
            }

            if (obj != null)
                _presenter.DefinirTipoDistribuicaoQuantPreco(obj);
        }

        private void TxtPercentualDistribuicao_LostFocus(object sender, RoutedEventArgs e)
        {
            Model.DadosDistribuicao obj = null;
            if (this.dtgDigitacaoDistribuicao.IsInserting)
                obj = (Model.DadosDistribuicao)this.dtgDigitacaoDistribuicao.GetInsertionRow().Item;
            else if (this.dtgDigitacaoDistribuicao.IsEditing)
            {
                obj = (Model.DadosDistribuicao)this.dtgDigitacaoDistribuicao.GetEditRow().Item;
                SinacorDecimalTextBox _txt = (SinacorDecimalTextBox)sender;
                obj.Percentual = _txt.Value > 0 ? _txt.Value : null;
            }

            if (obj != null)
                _presenter.DefinirTipoDistribuicaoPercentual(obj);
        }

        private void Preco_LostFocus(object sender, RoutedEventArgs e)
        {
            Model.DadosDistribuicao obj = null;
            if (this.dtgDigitacaoDistribuicao.IsInserting)
                obj = (Model.DadosDistribuicao)this.dtgDigitacaoDistribuicao.GetInsertionRow().Item;
            else if (this.dtgDigitacaoDistribuicao.IsEditing)
            {
                obj = (Model.DadosDistribuicao)this.dtgDigitacaoDistribuicao.GetEditRow().Item;
                SinacorDecimalTextBox _txt = (SinacorDecimalTextBox)sender;
                obj.Preco = _txt.Value > 0 ? _txt.Value : null;
            }

            if (obj != null)
                _presenter.DefinirTipoDistribuicaoQuantPreco(obj);
        }

        private void ContextMenu_ValidarDigitacao_Loaded(object sender, RoutedEventArgs e)
        {
            ((SinacorContextMenuItem)sender).IsEnabled = _presenter.ListaDigitacao.Count > 0;
        }

        private void btnDistribuicaoImportacao_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            ClearServiceErrors();

            flpDistribuicaoImportacao.IsEnabled = false;
            btnDistribuicaoImportacao.IsEnabled = false;
            dtgDigitacaoDistribuicao.IsEnabled = false;

            _presenter.ImportarDistribuicaoNegocio();
        }

        private void btnCancelarImportacao_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            _presenter.CancelarProcesso();
        }


    }
}
